Conversation
|
Warning Rate limit exceeded
⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughIntroduces four string-like attribute types (VAR_VARCHAR, VAR_TEXT, VAR_MEDIUMTEXT, VAR_LONGTEXT), centralizes attribute validation via a new Attribute validator, updates adapters and width calculations to support the types, broadens validators/index/query rules, and adds tests. Changes
Sequence Diagram(s)mermaid Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 4
🤖 Fix all issues with AI agents
In `@src/Database/Adapter/MariaDB.php`:
- Line 1719: The thrown DatabaseException message concatenates an extra literal
"', ' . ', '" causing a double comma before Database::VAR_POINT; update the
construction in the throw in MariaDB.php (the DatabaseException(...) line) to
remove the stray "', ' . ', '" and ensure the list of constants
(Database::VAR_STRING, VAR_VARCHAR, VAR_TEXT, VAR_MEDIUMTEXT, VAR_LONGTEXT,
VAR_INTEGER, VAR_FLOAT, VAR_BOOLEAN, VAR_DATETIME, VAR_RELATIONSHIP,
Database::VAR_POINT, Database::VAR_LINESTRING, Database::VAR_POLYGON) are
concatenated with a single ", " separator so the message prints correctly.
In `@src/Database/Database.php`:
- Around line 2278-2280: In validateAttribute(), don't ignore
$validator->isValid($attribute); instead check its boolean result and when false
retrieve the validator messages (e.g. $validator->getMessages()) and surface
them by throwing the same exception type used by other validators in this file
(or returning a failure consistent with the file's pattern), so include the
collected messages in the exception/error so callers see why validation failed;
reference validateAttribute(), $validator and isValid() to locate the code to
change.
In `@src/Database/Validator/Attribute.php`:
- Around line 451-469: The schema validator currently allows array defaults for
attributes not declared as arrays; update the checkDefaultValue method (in class
Attribute, function checkDefaultValue) to reject array defaults when the
attribute is not an array: detect when $default is an array (is_array($default))
and the attribute is not marked as an array (check $type !== 'array' and/or
$attribute->getAttribute('array', false) !== true), then set an appropriate
$this->message and throw DatabaseException; keep the existing required-check and
call to validateDefaultTypes for non-array cases.
In `@tests/e2e/Adapter/Scopes/AttributeTests.php`:
- Around line 2315-2347: Wrap the two size-violation blocks (the VARCHAR and
TEXT createDocument tests) in a guard that checks the adapter's attribute
support (use $this->adapter->getSupportForAttributes()); only run the try/catch
+ assertInstanceOf(StructureException::class, $e) when that returns true,
otherwise skip those assertions (mirror the existing gating pattern elsewhere in
AttributeTests.php). Locate the blocks that create documents with
'varchar_field' and 'text_field' and conditionally execute them based on
$this->adapter->getSupportForAttributes().
🧹 Nitpick comments (1)
tests/unit/Validator/StructureTest.php (1)
1076-1136: Consider exercisingtext_arraytoo.
text_arrayis defined but never asserted; adding a couple of cases would cover VAR_TEXT arrays.🧪 Suggested test additions for
text_array@@ $this->assertEquals(true, $validator->isValid(new Document([ '$collection' => ID::custom('posts'), 'varchar_array' => ['test1', 'test2', 'test3'], '$createdAt' => '2000-04-01T12:00:00.000+00:00', '$updatedAt' => '2000-04-01T12:00:00.000+00:00' ]))); + + $this->assertEquals(true, $validator->isValid(new Document([ + '$collection' => ID::custom('posts'), + 'text_array' => ['alpha', 'beta'], + '$createdAt' => '2000-04-01T12:00:00.000+00:00', + '$updatedAt' => '2000-04-01T12:00:00.000+00:00' + ]))); @@ $this->assertEquals('Invalid document structure: Attribute "varchar_array[\'0\']" has invalid type. Value must be a valid string and no longer than 128 chars', $validator->getDescription()); + + $this->assertEquals(false, $validator->isValid(new Document([ + '$collection' => ID::custom('posts'), + 'text_array' => [123], + '$createdAt' => '2000-04-01T12:00:00.000+00:00', + '$updatedAt' => '2000-04-01T12:00:00.000+00:00' + ]))); + + $this->assertEquals('Invalid document structure: Attribute "text_array[\'0\']" has invalid type. Value must be a valid string and no longer than 65535 chars', $validator->getDescription());
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (11)
src/Database/Adapter/MariaDB.phpsrc/Database/Adapter/Mongo.phpsrc/Database/Adapter/Postgres.phpsrc/Database/Adapter/SQL.phpsrc/Database/Database.phpsrc/Database/Validator/Attribute.phpsrc/Database/Validator/Index.phpsrc/Database/Validator/Structure.phptests/e2e/Adapter/Scopes/AttributeTests.phptests/unit/Validator/AttributeTest.phptests/unit/Validator/StructureTest.php
🧰 Additional context used
🧠 Learnings (4)
📚 Learning: 2025-10-03T02:04:17.803Z
Learnt from: abnegate
Repo: utopia-php/database PR: 721
File: tests/e2e/Adapter/Scopes/DocumentTests.php:6418-6439
Timestamp: 2025-10-03T02:04:17.803Z
Learning: In tests/e2e/Adapter/Scopes/DocumentTests::testSchemalessDocumentInvalidInteralAttributeValidation (PHP), when the adapter reports getSupportForAttributes() === false (schemaless), the test should not expect exceptions from createDocuments for “invalid” internal attributes; remove try/catch and ensure the test passes without exceptions, keeping at least one assertion.
Applied to files:
tests/unit/Validator/AttributeTest.phpsrc/Database/Adapter/Mongo.phptests/unit/Validator/StructureTest.phpsrc/Database/Database.phptests/e2e/Adapter/Scopes/AttributeTests.phpsrc/Database/Validator/Attribute.php
📚 Learning: 2025-07-30T19:17:53.630Z
Learnt from: ArnabChatterjee20k
Repo: utopia-php/database PR: 642
File: src/Database/Validator/PartialStructure.php:43-52
Timestamp: 2025-07-30T19:17:53.630Z
Learning: In PartialStructure validator, when filtering for required attributes validation using the $requiredAttributes parameter, $this->attributes should be used instead of the merged $attributes array because this validation is specifically for internal attributes like $createdAt and $updatedAt that are defined in the base Structure class, not collection-specific attributes.
Applied to files:
tests/unit/Validator/AttributeTest.phptests/unit/Validator/StructureTest.phpsrc/Database/Database.phpsrc/Database/Validator/Attribute.php
📚 Learning: 2025-10-29T12:27:57.071Z
Learnt from: ArnabChatterjee20k
Repo: utopia-php/database PR: 747
File: src/Database/Adapter/Mongo.php:1449-1453
Timestamp: 2025-10-29T12:27:57.071Z
Learning: In src/Database/Adapter/Mongo.php, when getSupportForAttributes() returns false (schemaless mode), the updateDocument method intentionally uses a raw document without $set operator for replacement-style updates, as confirmed by the repository maintainer ArnabChatterjee20k.
Applied to files:
src/Database/Adapter/Mongo.php
📚 Learning: 2025-10-16T08:48:36.715Z
Learnt from: fogelito
Repo: utopia-php/database PR: 739
File: src/Database/Adapter/Postgres.php:154-158
Timestamp: 2025-10-16T08:48:36.715Z
Learning: For the utopia-php/database repository, no migration scripts are needed for the collation change from utf8_ci to utf8_ci_ai in the Postgres adapter because there is no existing production data.
Applied to files:
src/Database/Adapter/Postgres.php
🧬 Code graph analysis (10)
src/Database/Adapter/SQL.php (1)
src/Database/Database.php (1)
Database(40-9363)
src/Database/Adapter/MariaDB.php (2)
src/Database/Database.php (1)
Database(40-9363)src/Database/Adapter/SQL.php (1)
getMaxVarcharLength(2224-2227)
tests/unit/Validator/AttributeTest.php (1)
src/Database/Validator/Attribute.php (1)
Attribute(12-554)
src/Database/Adapter/Mongo.php (1)
src/Database/Database.php (1)
Database(40-9363)
src/Database/Validator/Index.php (2)
src/Database/Query.php (1)
getAttribute(182-185)src/Database/Database.php (1)
Database(40-9363)
tests/unit/Validator/StructureTest.php (1)
src/Database/Validator/Structure.php (2)
Structure(20-472)getDescription(197-200)
src/Database/Database.php (1)
src/Database/Validator/Attribute.php (1)
Attribute(12-554)
src/Database/Adapter/Postgres.php (1)
src/Database/Database.php (1)
Database(40-9363)
tests/e2e/Adapter/Scopes/AttributeTests.php (1)
src/Database/Database.php (1)
Database(40-9363)
src/Database/Validator/Attribute.php (5)
src/Database/Database.php (2)
Database(40-9363)__construct(455-685)src/Database/Exception.php (1)
Exception(7-21)src/Database/Validator/Structure.php (2)
__construct(106-114)Structure(20-472)src/Database/Document.php (1)
getId(63-66)src/Database/Query.php (1)
limit(656-659)
🪛 GitHub Actions: CodeQL
src/Database/Database.php
[error] 2266-2266: PHPStan analysis failed. Command: ./vendor/bin/phpstan analyse --level 7 src tests --memory-limit 2G. Error: Call to an undefined method Utopia\Database\Adapter::getMaxVarcharLength().
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Setup & Build Docker Image
🔇 Additional comments (56)
src/Database/Validator/Structure.php (1)
346-352: LGTM!The new string type variants (
VAR_VARCHAR,VAR_TEXT,VAR_MEDIUMTEXT,VAR_LONGTEXT) correctly fall through to use theTextvalidator with size constraints, maintaining consistency with the existingVAR_STRINGhandling.src/Database/Adapter/Mongo.php (1)
2070-2073: LGTM!The new string type variants correctly map to MongoDB's
'string'BSON type, maintaining consistency withVAR_STRINGhandling. This ensures proper partial filter expressions for indexes.src/Database/Adapter/MariaDB.php (1)
1681-1694: LGTM!The explicit mappings for
VAR_VARCHAR,VAR_TEXT,VAR_MEDIUMTEXT, andVAR_LONGTEXTprovide precise control over SQL column types. TheVAR_VARCHARvalidation with a helpful exception message guides developers toward appropriate alternatives when size limits are exceeded.src/Database/Adapter/Postgres.php (2)
1925-1932: Postgres mapping for new string variants is solid.The VARCHAR/TEXT mappings align with PostgreSQL’s supported types.
1969-1969: Error message list is now consistent with new types.Good to see the expanded string variants reflected in the allowed-types message.
src/Database/Adapter/SQL.php (1)
1147-1158: Row-width estimation now covers the new string variants.This keeps size accounting aligned with the updated type set.
src/Database/Validator/Index.php (4)
292-302: Fulltext validation now recognizes the new string-like types.Looks aligned with the expanded type set.
355-361: Array/index length rules now cover VARCHAR/TEXT variants.Good consistency with the updated string type list.
395-399: Index length handling expanded appropriately.String-like variants are now validated consistently.
597-608: Trigram validation now supports the full string-like set.Matches the new string type coverage.
tests/unit/Validator/AttributeTest.php (27)
16-52: Covers duplicate attribute detection.
54-76: Happy-path string attribute validation is covered.
78-102: String size boundary validation is well covered.
104-128: Varchar size limit enforcement is covered.
130-154: Text size limit assertion is covered.
156-180: Mediumtext size limit assertion is covered.
182-206: Integer size limit (signed) behavior is covered.
208-232: Unknown type handling is covered.
234-258: Datetime required-filter enforcement is covered.
260-282: Valid datetime with required filter is covered.
284-308: Default value restriction for required attributes is covered.
310-334: Default value type mismatch is covered.
336-361: Vector unsupported-path validation is covered.
363-388: Vector array rejection is covered.
390-415: Vector minimum-dimension validation is covered.
417-442: Vector maximum-dimension validation is covered.
444-469: Spatial unsupported-path validation is covered.
471-496: Spatial array restriction is covered.
498-523: Spatial size constraint is covered.
525-550: Object unsupported-path validation is covered.
552-577: Object array restriction is covered.
579-604: Object size constraint is covered.
606-634: Attribute-count limit enforcement is covered.
636-664: Row-width limit enforcement is covered.
666-691: Vector default type validation is covered.
693-718: Vector default length validation is covered.
720-745: Vector default numeric-element validation is covered.tests/e2e/Adapter/Scopes/AttributeTests.php (2)
55-66: Nice coverage for new string defaults.These additions align with the new string types and expand invalid-default coverage appropriately.
87-178: Updates to create/delete flows look consistent.The new attribute/index/list/default additions and updated counts align with the expanded string types.
src/Database/Database.php (3)
28-52: New validator import + string-type constants look good.This aligns cleanly with the added string-type support.
2328-2362: Default-type validation updates are consistent.The new string variants are correctly treated as string defaults.
2258-2267: Mongo adapter is missinggetMaxVarcharLength()implementation.The method is defined in the SQL adapter but not in the base Adapter contract or the Mongo adapter. When Database.php line 2266 calls
$this->adapter->getMaxVarcharLength()with a Mongo adapter instance, it will cause a fatal error at runtime. Add the method to the Adapter base class (as abstract) and implement it in all concrete adapters, or provide a safe fallback with a default value.⛔ Skipped due to learnings
Learnt from: abnegate Repo: utopia-php/database PR: 721 File: tests/e2e/Adapter/Scopes/AttributeTests.php:1329-1334 Timestamp: 2025-10-03T01:50:11.943Z Learning: MongoDB has a 1024kb (1,048,576 bytes) limit for index entries. The MongoDB adapter's getMaxIndexLength() method should return this limit rather than 0.Learnt from: abnegate Repo: utopia-php/database PR: 721 File: tests/e2e/Adapter/Scopes/DocumentTests.php:6418-6439 Timestamp: 2025-10-03T02:04:17.803Z Learning: In tests/e2e/Adapter/Scopes/DocumentTests::testSchemalessDocumentInvalidInteralAttributeValidation (PHP), when the adapter reports getSupportForAttributes() === false (schemaless), the test should not expect exceptions from createDocuments for “invalid” internal attributes; remove try/catch and ensure the test passes without exceptions, keeping at least one assertion.Learnt from: ArnabChatterjee20k Repo: utopia-php/database PR: 642 File: src/Database/Validator/PartialStructure.php:43-52 Timestamp: 2025-07-30T19:17:53.630Z Learning: In PartialStructure validator, when filtering for required attributes validation using the $requiredAttributes parameter, $this->attributes should be used instead of the merged $attributes array because this validation is specifically for internal attributes like $createdAt and $updatedAt that are defined in the base Structure class, not collection-specific attributes.tests/unit/Validator/StructureTest.php (5)
104-143: String-type fixture attributes look good.
Sizes align with expected VARCHAR/TEXT limits and stay optional.
892-944: Varchar validation coverage is solid.
Covers valid input, type mismatch, and boundary length.
946-998: Text validation coverage looks good.
1000-1036: Mediumtext validation test is clear.
1038-1074: Longtext validation test is clear.src/Database/Validator/Attribute.php (9)
44-70: Constructor normalization is solid.
Lowercasing keys upfront helps avoid case-sensitive collisions.
72-103: Accessor methods are straightforward.
105-140: Validation pipeline is clear and ordered.
142-191: Duplicate checks read well and are case-insensitive.
193-227: Required-filter handling is concise.
229-247: Format validation looks correct.
249-276: Limit enforcement via callbacks is fine.
480-553: The original review comment is based on an incorrect assumption and can be closed.
Database::VAR_FLOATis defined as'double'(not'float'), which perfectly matches what PHP'sgettype()returns for float values. The current validation logic at lines 525-528 will correctly accept valid float defaults without modification.case Database::VAR_FLOAT: if ($type !== $defaultType) { // 'double' === 'double' ✓No fix is required.
Likely an incorrect or invalid review comment.
278-439: Consider adding non-zero guards or documenting that max limits must be provided.The max* properties (
maxStringLength,maxVarcharLength,maxIntLength) default to0, which renders validation ineffective—validation checks likeif ($size > $this->maxStringLength)would skip for any positive size. While the current production code (Database.php) always passes values from adapter methods, the design allows unsafe instantiation without explicit limits. Either add> 0checks to enforce validation or document that callers must provide non-zero limits.
✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/Database/Validator/Query/Filter.php (1)
257-267: Missing new string types in contains/notContains validation check.The condition at line 260 only allows
contains/notContainsqueries onVAR_STRINGattributes (for non-array types), but the new string types (VAR_VARCHAR,VAR_TEXT,VAR_MEDIUMTEXT,VAR_LONGTEXT) are not included. This would incorrectly reject contains queries on these text-like attributes.🐛 Proposed fix
if ( !$array && in_array($method, [Query::TYPE_CONTAINS, Query::TYPE_NOT_CONTAINS]) && $attributeSchema['type'] !== Database::VAR_STRING && + $attributeSchema['type'] !== Database::VAR_VARCHAR && + $attributeSchema['type'] !== Database::VAR_TEXT && + $attributeSchema['type'] !== Database::VAR_MEDIUMTEXT && + $attributeSchema['type'] !== Database::VAR_LONGTEXT && $attributeSchema['type'] !== Database::VAR_OBJECT && !in_array($attributeSchema['type'], Database::SPATIAL_TYPES) ) {Alternatively, consider defining a
STRING_TYPESconstant inDatabase.php(similar toSPATIAL_TYPES) to centralize string-like type checks:if ( !$array && in_array($method, [Query::TYPE_CONTAINS, Query::TYPE_NOT_CONTAINS]) && - $attributeSchema['type'] !== Database::VAR_STRING && + !in_array($attributeSchema['type'], Database::STRING_TYPES, true) && $attributeSchema['type'] !== Database::VAR_OBJECT && !in_array($attributeSchema['type'], Database::SPATIAL_TYPES) ) {
🤖 Fix all issues with AI agents
In `@src/Database/Adapter/MariaDB.php`:
- Around line 1681-1686: The VARCHAR branch in the case Database::VAR_VARCHAR in
MariaDB.php currently only checks upper bounds; add an explicit lower-bound
check to ensure $size is > 0 and throw a DatabaseException if not (similar
format to the existing exception, e.g., "VARCHAR size X is invalid; must be > 0.
Use TEXT, MEDIUMTEXT, or LONGTEXT instead."), keeping the existing
getMaxVarcharLength() check intact and returning "VARCHAR({$size})" only after
both validations pass.
In `@tests/e2e/Adapter/Scopes/AttributeTests.php`:
- Around line 2242-2374: The testStringTypeAttributes method creates the
'stringTypes' collection but never removes it, causing test pollution; wrap the
test body in a try/finally (or add cleanup at the end) and call
$database->deleteCollection('stringTypes') in the finally block (or after
assertions) to ensure the collection is removed even on failures—locate the code
inside testStringTypeAttributes and add the cleanup around the existing
createCollection / createDocument / assertions using the
Database::deleteCollection (or $database->deleteCollection) call.
🧹 Nitpick comments (2)
src/Database/Adapter/Mongo.php (1)
2701-2710: Avoid duplicated limits for VARCHAR.
Consider delegating togetLimitForString()to keep limits in sync.♻️ Proposed refactor
public function getMaxVarcharLength(): int { - return 2147483647; + return $this->getLimitForString(); }src/Database/Validator/Attribute.php (1)
538-559: Missing handling for VAR_ID in default value validation.The
supportedTypeslist in the default case includesVAR_RELATIONSHIPbut notVAR_ID. Additionally, neither type has a switch case. If a default value is ever set on these attribute types, the error message would be confusing (especially forVAR_RELATIONSHIPwhich would say "Unknown attribute type" while listing it as supported).Consider adding explicit cases or ensuring the supportedTypes list is consistent with what's actually handled.
♻️ Suggested handling
+ case Database::VAR_ID: + case Database::VAR_RELATIONSHIP: + if ($defaultType !== 'string') { + $this->message = 'Default value ' . $default . ' does not match given type ' . $type; + throw new DatabaseException($this->message); + } + break; default: $supportedTypes = [ Database::VAR_STRING, Database::VAR_VARCHAR, Database::VAR_TEXT, Database::VAR_MEDIUMTEXT, Database::VAR_LONGTEXT, Database::VAR_INTEGER, Database::VAR_FLOAT, Database::VAR_BOOLEAN, Database::VAR_DATETIME, - Database::VAR_RELATIONSHIP + Database::VAR_RELATIONSHIP, + Database::VAR_ID ];
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (6)
src/Database/Adapter/MariaDB.phpsrc/Database/Adapter/Mongo.phpsrc/Database/Validator/Attribute.phpsrc/Database/Validator/Query/Filter.phptests/e2e/Adapter/Scopes/AttributeTests.phptests/unit/Validator/AttributeTest.php
🚧 Files skipped from review as they are similar to previous changes (1)
- tests/unit/Validator/AttributeTest.php
🧰 Additional context used
🧠 Learnings (5)
📚 Learning: 2025-10-03T02:04:17.803Z
Learnt from: abnegate
Repo: utopia-php/database PR: 721
File: tests/e2e/Adapter/Scopes/DocumentTests.php:6418-6439
Timestamp: 2025-10-03T02:04:17.803Z
Learning: In tests/e2e/Adapter/Scopes/DocumentTests::testSchemalessDocumentInvalidInteralAttributeValidation (PHP), when the adapter reports getSupportForAttributes() === false (schemaless), the test should not expect exceptions from createDocuments for “invalid” internal attributes; remove try/catch and ensure the test passes without exceptions, keeping at least one assertion.
Applied to files:
tests/e2e/Adapter/Scopes/AttributeTests.phpsrc/Database/Validator/Attribute.php
📚 Learning: 2025-10-16T09:37:33.531Z
Learnt from: fogelito
Repo: utopia-php/database PR: 733
File: src/Database/Adapter/MariaDB.php:1801-1806
Timestamp: 2025-10-16T09:37:33.531Z
Learning: In the MariaDB adapter (src/Database/Adapter/MariaDB.php), only duplicate `_uid` violations should throw `DuplicateException`. All other unique constraint violations, including `PRIMARY` key collisions on the internal `_id` field, should throw `UniqueException`. This is the intended design to distinguish between user-facing document duplicates and internal/user-defined unique constraint violations.
Applied to files:
tests/e2e/Adapter/Scopes/AttributeTests.phpsrc/Database/Adapter/MariaDB.php
📚 Learning: 2025-10-03T01:50:11.943Z
Learnt from: abnegate
Repo: utopia-php/database PR: 721
File: tests/e2e/Adapter/Scopes/AttributeTests.php:1329-1334
Timestamp: 2025-10-03T01:50:11.943Z
Learning: MongoDB has a 1024kb (1,048,576 bytes) limit for index entries. The MongoDB adapter's getMaxIndexLength() method should return this limit rather than 0.
Applied to files:
src/Database/Adapter/Mongo.php
📚 Learning: 2025-10-29T12:27:57.071Z
Learnt from: ArnabChatterjee20k
Repo: utopia-php/database PR: 747
File: src/Database/Adapter/Mongo.php:1449-1453
Timestamp: 2025-10-29T12:27:57.071Z
Learning: In src/Database/Adapter/Mongo.php, when getSupportForAttributes() returns false (schemaless mode), the updateDocument method intentionally uses a raw document without $set operator for replacement-style updates, as confirmed by the repository maintainer ArnabChatterjee20k.
Applied to files:
src/Database/Adapter/Mongo.php
📚 Learning: 2025-07-30T19:17:53.630Z
Learnt from: ArnabChatterjee20k
Repo: utopia-php/database PR: 642
File: src/Database/Validator/PartialStructure.php:43-52
Timestamp: 2025-07-30T19:17:53.630Z
Learning: In PartialStructure validator, when filtering for required attributes validation using the $requiredAttributes parameter, $this->attributes should be used instead of the merged $attributes array because this validation is specifically for internal attributes like $createdAt and $updatedAt that are defined in the base Structure class, not collection-specific attributes.
Applied to files:
src/Database/Validator/Attribute.php
🧬 Code graph analysis (4)
src/Database/Validator/Query/Filter.php (1)
src/Database/Database.php (1)
Database(40-9363)
tests/e2e/Adapter/Scopes/AttributeTests.php (2)
src/Database/Database.php (3)
Database(40-9363)createAttribute(2014-2084)create(1507-1530)src/Database/Adapter/SQL.php (1)
createAttribute(246-260)
src/Database/Adapter/Mongo.php (2)
src/Database/Database.php (1)
Database(40-9363)src/Database/Adapter/SQL.php (1)
getMaxVarcharLength(2224-2227)
src/Database/Adapter/MariaDB.php (3)
src/Database/Database.php (1)
Database(40-9363)src/Database/Adapter/Mongo.php (1)
getMaxVarcharLength(2707-2710)src/Database/Adapter/SQL.php (1)
getMaxVarcharLength(2224-2227)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (14)
- GitHub Check: Adapter Tests (Schemaless/MongoDB)
- GitHub Check: Adapter Tests (SharedTables/Postgres)
- GitHub Check: Adapter Tests (SharedTables/SQLite)
- GitHub Check: Adapter Tests (SharedTables/MySQL)
- GitHub Check: Adapter Tests (Mirror)
- GitHub Check: Adapter Tests (Pool)
- GitHub Check: Adapter Tests (SharedTables/MongoDB)
- GitHub Check: Adapter Tests (MongoDB)
- GitHub Check: Adapter Tests (SharedTables/MariaDB)
- GitHub Check: Adapter Tests (Postgres)
- GitHub Check: Adapter Tests (MariaDB)
- GitHub Check: Adapter Tests (SQLite)
- GitHub Check: Adapter Tests (MySQL)
- GitHub Check: Unit Test
🔇 Additional comments (10)
src/Database/Adapter/MariaDB.php (1)
1719-1719: Unknown-type message updated for new string variants.src/Database/Adapter/Mongo.php (1)
2068-2073: Type mapping for new string variants looks good.tests/e2e/Adapter/Scopes/AttributeTests.php (2)
55-66: Invalid-default matrix now covers new string types.
87-175: Create/delete coverage updated consistently for new string types.
Counts and index coverage appear aligned with the new attributes.src/Database/Validator/Attribute.php (5)
44-70: Well-structured constructor with comprehensive configuration options.The constructor properly indexes attributes by lowercased key for case-insensitive lookups, which aligns with the duplicate checking logic. The promoted properties pattern keeps the code clean.
115-140: Clean validation orchestration.The
isValidmethod provides a clear sequence of validation steps with early returns on failure. The order is logical: duplicates → filters → format → limits → type → defaults.
304-330: New string type size limits are correctly implemented.The size limits match the MySQL storage limits:
- VARCHAR: uses configurable
maxVarcharLength- TEXT: 65,535 bytes (2^16 - 1)
- MEDIUMTEXT: 16,777,215 bytes (2^24 - 1)
- LONGTEXT: 4,294,967,295 bytes (2^32 - 1)
451-476: Array default validation for non-array attributes is now properly handled.The fix at lines 467-471 correctly rejects array defaults for non-array attributes while appropriately excluding
VAR_VECTORand spatial types which use arrays internally for their data representation.
506-516: Correct grouping of string-like types for default validation.All new string types (VARCHAR, TEXT, MEDIUMTEXT, LONGTEXT) are properly grouped with VAR_STRING to validate that default values are strings.
src/Database/Validator/Query/Filter.php (1)
144-150: Correct addition of new string types to the validation switch.All new string-like types are appropriately routed to the
Textvalidator, consistent with howVAR_STRINGis handled.
✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.
Object types use arrays internally (like vectors and spatial types), so they should be allowed to have array default values. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add the abstract method to the base Adapter class and implement it in the Pool adapter to fix PHPStan errors. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Throws DatabaseException when VARCHAR size is <= 0, ensuring both lower and upper bounds are validated before returning the VARCHAR type. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Summary by CodeRabbit
New Features
Validation
Indexing
Tests
✏️ Tip: You can customize this high-level summary in your review settings.